package com.weixin.api;

import org.apache.commons.lang3.StringUtils;

import com.weixin.api.request.WxPayRequest;
import com.weixin.api.request.WxWithdrawalsRequest;
import com.weixin.config.WxpayConfig;
import com.weixin.pojo.pay.request.PayRequest;
import com.weixin.pojo.pay.request.QueryRequest;
import com.weixin.pojo.pay.request.RefundRequest;
import com.weixin.pojo.pay.response.PayResponse;
import com.weixin.pojo.pay.response.QueryResponse;
import com.weixin.pojo.pay.response.RefundResponse;
import com.weixin.pojo.withdrawals.WithdrawalsRequest;
import com.weixin.pojo.withdrawals.WithdrawalsResponse;
import com.weixin.utils.WxSign;
import com.weixin.utils.WxXml;

/**
 * 类描述：微信支付工具类<br>
 * 创建人：邓强 <br>
 * 创建时间：2017年10月30日 下午5:32:28 <br>
 * 修改人： <br>
 * 修改时间：2017年10月30日 下午5:32:28 <br>
 * 修改备注： <br>
 * 
 * @version V1.0
 */
public class WxPay {

	/**
	 * 微信提现<br>
	 * <br>
	 * 创建人：邓强 <br>
	 * 创建时间：2017年10月30日 下午5:07:37 <br>
	 * 修改人： <br>
	 * 修改时间：2017年10月30日 下午5:07:37 <br>
	 * 修改备注： <br>
	 * 
	 * @param wxpayConfig
	 * @param wr
	 * @return
	 */
	public static WithdrawalsResponse withdrawalsRequest(WxpayConfig wxpayConfig, WithdrawalsRequest wr) {
		WithdrawalsResponse withdrawalsResponse = new WithdrawalsResponse();
		wr.setMch_appid(wxpayConfig.getAppid());
		wr.setMchid(wxpayConfig.getMchId());
		try {
			wr.setSign(WxSign.getSign(wr, wxpayConfig.getKey()));
			final String body = WxXml.toXml(wr);

			String resStr = WxWithdrawalsRequest.withdrawalsRequest(wxpayConfig, body);

			if (StringUtils.isNotBlank(resStr)) {
				withdrawalsResponse = WxXml.toBean(resStr, WithdrawalsResponse.class);
			}
		} catch (Exception e) {
			withdrawalsResponse = new WithdrawalsResponse();
			withdrawalsResponse.setResult_code("FAIL");
			withdrawalsResponse.setReturn_msg("提现功能----提交至微信服务器发生异常!");
		}
		return withdrawalsResponse;

	}

	/**
	 * 统一下单<br>
	 * <br>
	 * 创建人：邓强 <br>
	 * 创建时间：2017年10月30日 下午5:32:38 <br>
	 * 修改人： <br>
	 * 修改时间：2017年10月30日 下午5:32:38 <br>
	 * 修改备注： <br>
	 * 
	 * @param wxpayConfig
	 * @param pq
	 * @return
	 */
	public static PayResponse payRequest(WxpayConfig wxpayConfig, PayRequest pq) {
		PayResponse payResponse = new PayResponse();
		try {
			pq.setSign(WxSign.getSign(pq, wxpayConfig.getKey()));
			final String body = WxXml.toXml(pq);

			String resStr = WxPayRequest.payRequest(wxpayConfig, body);
			if (StringUtils.isNotBlank(resStr)) {
				payResponse = WxXml.toBean(resStr, PayResponse.class);
			}
		} catch (Exception e) {
			payResponse = new PayResponse();
			payResponse.setResult_code("FAIL");
			payResponse.setReturn_msg("提现功能----提交至微信服务器发生异常!");
		}
		return payResponse;
	}

	/**
	 *  微信退款<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年11月6日 下午1:47:51    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年11月6日 下午1:47:51   <br>  
	 * 修改备注：     <br> 
	 * @param wxpayConfig
	 * @param rq
	 * @return
	 */
	public static RefundResponse refund(WxpayConfig wxpayConfig, RefundRequest rq) {
		RefundResponse refundResponse = new RefundResponse();
		try {
			rq.setSign(WxSign.getSign(rq, wxpayConfig.getKey()));
			final String body = WxXml.toXml(rq);
			String resStr = WxPayRequest.refund(wxpayConfig, body);
			if (StringUtils.isNotBlank(resStr)) {
				refundResponse = WxXml.toBean(resStr, RefundResponse.class);
			}
		} catch (Exception e) {
			refundResponse = new RefundResponse();
			refundResponse.setResult_code("FAIL");
			refundResponse.setReturn_msg("提现功能----提交至微信服务器发生异常!");
		}
		return refundResponse;
	}

	/**
	 * 查询订单<br>
	 * <br>  
	 * 创建人：邓强   <br>
	 * 创建时间：2017年11月6日 下午1:48:10    <br> 
	 * 修改人：  <br>
	 * 修改时间：2017年11月6日 下午1:48:10   <br>  
	 * 修改备注：     <br> 
	 * @param wxpayConfig
	 * @param qr
	 * @return
	 */
	public static QueryResponse query(WxpayConfig wxpayConfig, QueryRequest qr) {
		QueryResponse queryResponse = new QueryResponse();
		try {
			qr.setSign(WxSign.getSign(qr, wxpayConfig.getKey()));
			final String body = WxXml.toXml(qr);
			String resStr = WxPayRequest.query(wxpayConfig, body);
			if (StringUtils.isNotBlank(resStr)) {
				queryResponse = WxXml.toBean(resStr, QueryResponse.class);
			}
		} catch (Exception e) {
			queryResponse = new QueryResponse();
			queryResponse.setResult_code("FAIL");
			queryResponse.setReturn_msg("提现功能----提交至微信服务器发生异常!");
		}
		return queryResponse;
	}
}
